package com.greyshark.lib.bluetooth.utils

import android.os.Handler
import android.os.Looper
import com.greyshark.lib.bluetooth.parse.PacketParse
import java.util.concurrent.atomic.AtomicBoolean

class TimeoutManager {

    companion object {
        val instance: TimeoutManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            TimeoutManager()
        }
    }

    private val handler = Handler(Looper.getMainLooper())
    private val timeoutTasks = mutableMapOf<String, Runnable>()
    private val isRunning = AtomicBoolean(true)

    /**
     * 启动超时：根据 key 发送指令后调用，delayMs 后执行 onTimeout
     * @param key 唯一标识（如命令 ID），用于取消
     * @param delayMs 超时时间（毫秒）
     * @param onTimeout 超时回调
     */
    fun startTimeout(
        key: String,
        delayMs: Long,
        onTimeout: () -> Unit  // 超时处理，例如抛异常或更新 UI
    ) {
        // 取消旧任务（如果 key 已存在）
        cancelTimeout(key)

        val runnable = Runnable {
            onTimeout()
            timeoutTasks.remove(key)  // 清理
        }
        timeoutTasks[key] = runnable
        handler.postDelayed(runnable, delayMs)
    }

    /**
     * 取消指定 key 的超时
     * @param key 要取消的 key
     * @return 是否成功取消（true 表示有任务被取消）
     */
    fun cancelTimeout(key: String): Boolean {
        val runnable = timeoutTasks.remove(key)
        return if (runnable != null) {
            handler.removeCallbacks(runnable)
            true
        } else false
    }

    /**
     * 取消所有超时（例如在断开 BLE 时调用）
     */
    fun cancelAll() {
        timeoutTasks.values.forEach { runnable ->
            handler.removeCallbacks(runnable)
        }
        timeoutTasks.clear()
    }

    /**
     * 清理资源（Activity onDestroy 等时调用）
     */
    fun destroy() {
        cancelAll()
        isRunning.set(false)
        handler.removeCallbacksAndMessages(null)
    }
}